package main

import "fmt"

/*func main() {
	var i1 =5
	fmt.Printf("an intteger：%d,it's location in memory:%p\n",i1,&i1);
	var intP *int
	intP =&i1
	fmt.Printf("内存地址是：%p 值是:%d",intP,*intP);

}
*/

func main() {
	var a int = 10
	//每个变量有2层含义：变量的内存，变量的地址
	fmt.Printf("a = %d\n", a)   //变量的内存值
	fmt.Printf("&a = %v\n", &a) //变量的地址
	show(&a)

	//保存某个变量的地址，需要指针类型   *int 保存int的地址， **int 保存 *int 地址
	//声明(定义)， 定义只是特殊的声明
	//定义一个变量p, 类型为*int
	var p *int
	p = &a                                 //指针变量指向谁，就把谁的地址赋值给指针变量
	fmt.Printf("p = %v, &a = %v\n", p, &a) //%v 自动配置类型
	fmt.Println("*p的值是", *p)

	*p = 666 //*p操作的不是p的内存，是p所指向的内存(就是a)
	fmt.Printf("*p = %v, a = %v\n", *p, a)
	fmt.Printf("a 的地址 = %v\n", &a) //内存地址不变，值变了
	fmt.Printf("p 的地址 = %v\n", p)  //内存地址不变，值变了

}

func show(r *int) {
	fmt.Printf("r是 %v\n", r)
	*r = 200 // 修改r的值是200
	fmt.Printf("r是 %v\n", r)
	fmt.Printf("r是 %v\n", *r)
}
